package info.motteke.mixivoice4j;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * MixiVoiceの操作を行うクラスです。
 *
 * @author Y.Wakakamatsu
 *
 */
public interface MixiVoice {

    /**
     * {@linkplain MixiVoiceCache}を設定します。
     *
     * @param cache
     *            キャッシュ
     */
    public void setMixiVoiceCache(MixiVoiceCache cache);

    /**
     * {@linkplain DataBuilderFactory}を設定します。
     *
     * @param factory
     *            ファクトリ
     */
    public void setDataBuilderFactory(DataBuilderFactory factory);

    /**
     * ログインします。
     *
     * @param userId
     *            ログインに利用するユーザID。通常はe-メール
     * @param password
     *            ログイン用パスワード
     */
    public void login(String userId, String password);

    /**
     * ログアウトします。
     */
    public void logout();

    /**
     * 終了処理を行います。
     */
    public void close();

    /**
     * 指定した日時からのつぶやきを取得します。
     *
     * @param from
     *            日時
     * @return 取得したつぶやき
     */
    public List<Entry> getVoices(Date from);

    /**
     * 指定したページまでのつぶやきを取得します。
     *
     * @param page
     *            ページ
     * @return 取得したつぶやき
     */
    public List<Entry> getVoices(int page);

    /**
     * 指定したつぶやきのサブデータを更新します。
     *
     * @param voice
     *            つぶやき
     */
    public Entry update(Entry voice);

    /**
     * つぶやきを投稿します。
     *
     * @param body
     *            つぶやきの内容
     */
    public void post(String body);

    /**
     * つぶやきを投稿します。
     *
     * @param body
     *            つぶやきの内容
     * @param image
     *            添付する画像
     * @param imageName
     *            添付する画像の名前
     */
    public void post(String body, InputStream image, String imageName);

    /**
     * 指定したつぶやきを削除します。
     *
     * @param voice
     *            削除するつぶやき
     */
    public void removeVoice(Entry voice);

    /**
     * 指定したつぶやきのコメントを削除します。
     *
     * @param voice
     *            削除するつぶやき
     */
    public void removeVoice(Comment voice);

    /**
     * コメントをつけます。
     *
     * @param voice
     *            対象となるつぶやき
     * @param body
     *            コメントの内容
     */
    public void comment(Entry voice, String body);

    /**
     * 指定したつぶやきにつけた、自分のイイネ！を削除します。
     *
     * @param voice
     *            イイネ！を消すつぶやき
     */
    public void removeFavorite(Entry voice);

    /**
     * 指定したつぶやきにつけた、指定ユーザのイイネ！を削除します。
     *
     * @param voice
     *            イイネ！を消すつぶやき
     * @param user
     *            イイネ！をつけたユーザ
     */
    public void removeFavorite(Entry voice, User user);

    /**
     * 指定したURLの画像を取得します。
     *
     * @param url
     *            画像のURL
     * @return 画像を読み込むための{@link InputStream}
     */
    public InputStream getImage(String url);

    /**
     * ユーザが更新された際に通知を受けるリスナを登録します。
     *
     * @param listener
     *            リスナ
     */
    public void addUserUpdateListener(UserUpdateListener listener);

    /**
     * {@linkplain Entry}が更新された際に通知を受けるリスナを登録します。
     *
     * @param listener
     *            リスナ
     */
    public void addEntryUpdateListener(EntryUpdateListener listener);

    /**
     * {@linkplain Voice}が更新された際に通知を受けるリスナを登録します。
     *
     * @param listener
     *            リスナ
     */
    public void addVoiceCreateListener(VoiceCreateListener listener);

    /**
     * 引数の更新戦略に基づいて更新を行います。
     *
     * @param strategy
     *            更新戦略
     */
    public void update(UpdateStrategy strategy);

    public void setMixiVoiceObserver(MixiVoiceObserver observer);
}
